using UnityEngine;
using System.Collections;

public class ActionPush
{

    public bool isUnlocked = false;
    public bool pushMode = false;

    #region Singleton

    private static ActionPush instance = new ActionPush();
    public static ActionPush Instance { get { return instance; } }
    private ActionPush() { }

    #endregion

    public void StartAction()
    {        
        if (pushMode)
        {
            pushMode = !pushMode;
            Debug.Log("Accion: paro de empujar!!");
        }
        else
        {
            pushMode = !pushMode;
            Debug.Log("Accion: empiezo a empujar!!");
        }

    }

    public void doAction(PlayerControl pc, GameObject go)
    {     
        Vector3 pushDir = Vector3.zero;                 // direccion de empuje
        Vector3 dirOffset = new Vector3();              // distancia del objeto al player cuando empieza a empujar. usado para que el objeto no salga disparado
        float offset = 1.6f;                            // distancia del objeto al player mientras empuja. (1-lo atraviesa. 1,5-no se mueve. 1,6-se mueve despacio. 1,7+-se mueve rapido
        
        if (pushMode)
        {
            dirOffset = pc.transform.position - go.transform.position;

            if (CalculaPosFrente(go))
            {
                // teclas de arriba y abajo
                if (Input.GetKey(InputConstants.KEY_UP))
                    pushDir.z = offset;
                else if (Input.GetKey(InputConstants.KEY_DOWN))
                    pushDir.z = -offset;
                else
                    pushDir.z = 0;
            }

            if (CalculaPosLado(go))
            {
                // teclas de derecha e izquierda
                if (Input.GetKey(InputConstants.KEY_RIGHT))
                    pushDir.x = offset;
                else if (Input.GetKey(InputConstants.KEY_LEFT))
                    pushDir.x = -offset;
                else
                    pushDir.x = 0;
            }
        }

        if (pushDir != Vector3.zero)
        {
            pushDir += dirOffset;
            go.transform.position += pushDir;
        }


        // TODO:    evitar que se mueva en cualquier direccion. solo alante / atras
        // TODO:    evitar moverse en diagonal
        // TODO:    controlar HUD de la caja, se descoloca
        // TODO:    evitar que se mueva cuando choque con un enemigo/pared
        
    }

    public void Unlock()
    {
        isUnlocked = true;
    }

    public void Lock()
    {
        isUnlocked = false;
    }

    private bool CalculaPosFrente(GameObject go)
    {
        RaycastHit impacto;
        Vector3 fwd = go.transform.TransformDirection(Vector3.forward);

        if (Physics.Raycast(go.transform.position, fwd, out impacto))
        {
            if (impacto.transform.tag == StringConstants.TAG_PLAYER)
            {
                return true;
            }
        }
        
        if (Physics.Raycast(go.transform.position, -fwd, out impacto))
        {
            if (impacto.transform.tag == StringConstants.TAG_PLAYER)
            {
                return true;
            }
        }

        return false;
    }

    private bool CalculaPosLado(GameObject go)
    {
        RaycastHit impacto;
        Vector3 right = go.transform.TransformDirection(Vector3.right);

        if (Physics.Raycast(go.transform.position, right, out impacto))
        {
            if (impacto.transform.tag == StringConstants.TAG_PLAYER)
            {
                return true;
            }
        }

        if (Physics.Raycast(go.transform.position, -right, out impacto))
        {
            if (impacto.transform.tag == StringConstants.TAG_PLAYER)
            {
                return true;
            }
        }

        return false;
    }

}
